Controllers in some storage systems have a front end module and a back end module. The front end module receives read/write commands from a host, parses the commands, and stores them in a queue until they are ready to be sent to the back end module. Some front end modules send commands to the back end module in the order in which they are received, while other front end modules take commands out-of-order to combine them into groups (e.g., a group of write commands or a group of read commands). When the back end module receives commands from the front end module, it processes the commands and sends them to the memory of the storage system for completion. The back end module eventually informs the front end module that the command has been completed.